package com.mgq.java8.future;

import com.mgq.juc.threadpool.TestJdkFixedThreadPool;

import java.util.Random;
import java.util.concurrent.*;

/**
 * <b>功能：</b>测试jdk1.7 future<br>
 * <b>Copyright TCSL</b>
 * <li>版本&nbsp;&nbsp;&nbsp;&nbsp;修改日期&nbsp;&nbsp;&nbsp;&nbsp;部　　门&nbsp;&nbsp;&nbsp;&nbsp;作　者&nbsp;&nbsp;&nbsp;&nbsp;变更内容</li><hr>
 * <li>v1.0&nbsp;&nbsp;&nbsp;&nbsp;20220609&nbsp;&nbsp;营业后台&nbsp;&nbsp;&nbsp;&nbsp;马广奇&nbsp;&nbsp;&nbsp;&nbsp;创建类</li>
 * <br><br>
 *
 * @author 马广奇
 * @version 2022-06-09 17:15
 */
public class TestJdk7Future {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2, new ThreadFactory() {
            int count = 0;
            @Override
            public Thread newThread(Runnable r) {
                count++;
                return new Thread(r, "future线程" + count);
            }
        });
        Future<Double> future = executorService.submit(TestJdk7Future::doSomeThing);
        try {
            Double aDouble = future.get(1, TimeUnit.SECONDS);
        }  catch (ExecutionException e) {
            // 计算抛出一个异常
            e.printStackTrace();
        }catch (InterruptedException e) {
            e.printStackTrace();
            // 当前线程在等待过程中被中断
        } catch (TimeoutException e) {
            //get 超时抛出的异常
            e.printStackTrace();
        }

    }
        // 将两个异步计算合并为一个——这两个异步计算之间相互独立，同时第二个又依赖于第一个的结果。
        // 等待Future集合中的所有任务都完成。
        // 仅等待Future集合中最快结束的任务完成（有可能因为它们试图通过不同的方式计算同一个值），并返回它的结果。
        // 通过编程方式完成一个Future任务的执行（即以手工设定异步操作结果的方式）。
        // 应对Future的完成事件（即当Future的完成事件发生时会收到通知，并能使用Future计算的结果进行下一步的操作，不只是简单地阻塞等待操作的结果）。
    private static Double doSomeThing() throws InterruptedException {
        Thread.sleep(2000);
        return new Random().nextDouble();
    }


}
